#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;

//两张哈希表 + 优先处理字符单词数量不匹配

class Solution {
public:
    bool wordPattern(string pattern, string s) {
        //如果单词和字母数量不匹配 -> 无法配对
        int TabCnt = 0;
        for(int i = 0; i < s.size(); ++i)
            if(s[i] == ' ') ++TabCnt;
        if(pattern.size() != TabCnt + 1) return false;

        unordered_map<char, string> CharToStr;
        unordered_map<string, char> StrToChar;
        //控制单词位置
        int wordBegin = 0;
        int wordEnd = (s.find(' ', wordBegin) == string::npos) ? s.size() :  s.find(' ', wordBegin);

        for(int i = 0; i < pattern.size(); ++i){
            //取出单词和字符
            string word(s.begin() + wordBegin, s.begin() + wordEnd);
            char symbol = pattern[i];

            auto Pr1 = CharToStr.insert({symbol, word});
            //插入成功 但是可能出现不同symbol映射一个word的情况
            if(Pr1.second){
                //已经存在该映射 此时出现了不同symbol映射一个word的情况
                if(StrToChar.find(word) != StrToChar.end())  return false;
                else StrToChar.insert({word, symbol});
            }
            //插入失败，说明已经存在symbol对应的映射关系 判断一下
            else{
                if(CharToStr[symbol] != word) return false;
            }
            //调整单词
            wordBegin = ++wordEnd;
            wordEnd = (s.find(' ', wordBegin) == string::npos) ? s.size() :  s.find(' ', wordBegin);
        }
        return true;
    }
};
